﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*
 * 
 * Este classe forneçe rotinas para transformar valores imediatos em números
 * O valor imediato pode ser um literal numérico ou um rótulo
 * 
 */

namespace J_FoundationClasses.Programacao
{
    public static class Imediato
    {
        public static uint  TransIm_Posi(string im)
        {
            // transformar literal numérico inteiro positivo
            uint val;
            if ((im == null) || (im == "")) throw new ArgumentNullException("Falta valor imediato.");
            if (!uint.TryParse(im, out val)) throw new ArgumentException("Valor imediato numérico positivo ilegal: " + im);
            return val;
        }
        public static uint TransIm_Rotu(string im)
        {
            // transformar rótulo
            if ((im == null) || (im == "")) throw new ArgumentNullException("Falta valor imediato.");
            if (!Token.LegitId(im)) throw new ArgumentException("Identificador inválido: " + im);
            // ############## acesso à tabela
            return 0;
        }
        public static uint TransIm_RotuPosi(string im)
        {
            // transformar rótulo ou literal numérico inteiro positivo
            // o caso FFFCh é ambiguo. Será testado primeiramente como literal hex.
            uint val;
            if ((im == null) || (im == "")) throw new ArgumentNullException("Falta valor imediato.");
            if (uint.TryParse(im, out val)) return val;
            else
            {
                if (!Token.LegitId(im)) throw new ArgumentException("Identificador inválido: " + im);
                // ############## acesso à tabela
                return 0;
            }
        }
        public static int TransIm_Num(string im)
        {
            // transformar literal numérico inteiro
            int val;
            if ((im == null) || (im == "")) throw new ArgumentNullException("Falta valor imediato.");
            if (!int.TryParse(im, out val)) throw new ArgumentException("Valor imediato numérico ilegal: " + im);
            return val;
        }
    }
}
